home *** CD-ROM | disk | FTP | other *** search
/ Network Support Library / RoseWare - Network Support Library.iso / apidev / locks.arc / PHYS_NET.C < prev    next >
Text File  |  1989-05-11  |  3KB  |  147 lines

  1. /* Functions for physical record locking/unlocking for NETWORK files */
  2. #include <dos.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5.  
  6. /* Return lo word of a long
  7. */
  8. unsigned lo(l)
  9. long l;
  10. {
  11.   return(l&0xFFFF);
  12. };
  13.  
  14. /* Return hi word of a long
  15. */
  16. unsigned hi(l)
  17. long l;
  18. {
  19.   return(l>>16);
  20. };
  21.  
  22. /* Set locking mode
  23. */
  24. set_lock_mode(mode)
  25. int mode;
  26. {
  27. struct REGPACK regs;
  28.   regs.r_ax = 0xC600 + mode;
  29.   intr(0x21,®s);
  30. };
  31.  
  32. /* Log and lock a record
  33. */
  34. int log_rec(handle,start,size,timeout,flgs)
  35. int handle;
  36. long start;
  37. long size;
  38. int timeout;
  39. int flgs;
  40. {
  41. struct REGPACK regs;
  42.   regs.r_ax = 0xBC00|flgs;
  43.   regs.r_bx = handle;
  44.   regs.r_cx = hi(start);
  45.   regs.r_dx = lo(start);
  46.   regs.r_bp = timeout;
  47.   regs.r_si = hi(size);
  48.   regs.r_di = lo(size);
  49.   intr(0x21,®s);
  50.   return(lo(regs.r_ax));
  51. };
  52.  
  53. /* Clear the records that have been logged or locked
  54. */
  55. int clear_recs()
  56. {
  57. struct REGPACK regs;
  58.   regs.r_ax = 0xC400;
  59.   intr(0x21,®s);
  60.   return(lo(regs.r_ax));
  61. };
  62.  
  63. main()
  64. {
  65. char c;
  66. int start;
  67. int size;
  68. int timeout;
  69. int handle;
  70. char buff[256];
  71. int i;
  72. int flgs;
  73.   handle = open("test.dat",O_RDWR|O_DENYNONE|O_BINARY);
  74.   set_lock_mode(1);
  75.   while (!0)
  76.   {
  77.     clrscr();
  78.     printf("Enter (L)ock,(C)lear locks,(R)ead,(W)rite,(Q)uit :");
  79.     c=getch();
  80.     printf("\n");
  81.     if ((c==27)||(c=='q')||(c=='Q'))
  82.     {
  83.       set_lock_mode(0);
  84.       exit(0);
  85.     }
  86.  
  87.     if ((c=='l')||(c=='L'))
  88.     {
  89.       printf("Enter start   : ");
  90.       scanf("%d",&start);
  91.       printf("Enter size    : ");
  92.       scanf("%d",&size);
  93.       printf("Enter timeout : ");
  94.       scanf("%d",&timeout);
  95.       printf("Bit 0 - log and lock, Bit 1 - non-exclusive\n");
  96.       printf("Enter flags : ");
  97.       scanf("%d",&flgs);
  98.       if (!log_rec(handle,(long)start,(long)size,timeout,flgs))
  99.       {
  100.         printf("LOGGING LOCKING ERROR");
  101.         getch();
  102.       }
  103.     }
  104.     if ((c=='c')||(c=='C'))
  105.     {
  106.       if(!clear_recs())
  107.       {
  108.         printf("CLEARING ERROR");
  109.         getch();
  110.       }
  111.     }
  112.     if ((c=='r')||(c=='R'))
  113.     {
  114.       printf("Enter start   : ");
  115.       scanf("%d",&start);
  116.       printf("Enter size    : ");
  117.       scanf("%d",&size);
  118.       lseek(handle,(long)start,SEEK_SET);
  119.       i = read(handle,&buff,size);
  120.       if (i!=size)
  121.       {
  122.         printf("READ ERROR\n");
  123.         getch();
  124.       }
  125.       for (i=0;i!=size;i++)
  126.         putch(buff[i]);
  127.       printf("\n");
  128.       getch();
  129.     }
  130.     if ((c=='w')||(c=='W'))
  131.     {
  132.       printf("Enter start   : ");
  133.       scanf("%d",&start);
  134.       printf("Enter size    : ");
  135.       scanf("%d",&size);
  136.       lseek(handle,(long)start,SEEK_SET);
  137.       printf("Enter in the %d characters\n",size);
  138.       for (i=0;i!=size;i++)
  139.       {
  140.         buff[i]=getch();
  141.         putch(buff[i]);
  142.       }
  143.       printf("\n");
  144.       write(handle,&buff,size);
  145.     }
  146.   }
  147. };